/**
 * Description:
 * Class Name:PhantomReferenceTest
 * Date:2022/2/13 13:50
 *
 * @author LTisme
 * @version JAVA17
 */
package 疯狂Java讲义.第6章_面向对象_下._6_10_对象与垃圾回收._6_10_4_对象的软_弱_虚引用;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

public class PhantomReferenceTest{
    public static void main(String[] args) throws Exception{
        // 创建一个字符串对象
        var str = new String("字符串2");
        // 创建一个引用队列
        var rq = new ReferenceQueue();
        // 创建一个虚引用，让此虚引用引用到"字符串2"，入参需要有引用队列
        var pr = new PhantomReference(str, rq);
        System.out.println(rq.poll() == pr);		// 与②作对比，此时pr指向的是字符串对象，而rq.poll()是null
        // 切断对"字符串2"的强引用
        str = null;
        // 由于并不能通过虚引用获取被引用的对象，所以此处输出null
        System.out.println(pr.get());               // ①
        // 强制垃圾回收
        System.gc();
        System.runFinalization();
        // 垃圾回收之后，虚引用将被放入引用队列中
        // 取出引用队列中最先进入队列的引用与pr进行比较
        System.out.println(rq.poll() == pr);        // ②，此时两者都是null
    }
}
